From c4da02a2ab46824826cbcced42844cfaf737e52a Mon Sep 17 00:00:00 2001 From: "kaf24@firebug.cl.cam.ac.uk" Date: Tue, 22 Nov 2005 07:08:57 +0100 Subject: [PATCH] Fix the zombie domain when destroying 2.6 linux vmx guest. The zombie domain is caused by unreleased shadow page because of lack of put_shadow_ref. When unshadow a L1 page, set l2e to zero and put ref. Signed-off-by: --- xen/arch/x86/shadow.c | 5 +++-- xen/arch/x86/shadow32.c | 3 ++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/xen/arch/x86/shadow.c b/xen/arch/x86/shadow.c index 6d44c5fc98..14ed7ad4ed 100644 --- a/xen/arch/x86/shadow.c +++ b/xen/arch/x86/shadow.c @@ -1536,12 +1536,13 @@ static int resync_all(struct domain *d, u32 stype) perfc_incr_histo(l1_entries_checked, max_shadow - min_shadow + 1, PT_UPDATES); if ( d->arch.ops->guest_paging_levels >= PAGING_L3 && unshadow_l1 ) { - pgentry_64_t l2e = {0}; + pgentry_64_t l2e; __shadow_get_l2e(entry->v, entry->va, &l2e); if ( entry_get_flags(l2e) & _PAGE_PRESENT ) { - entry_remove_flags(l2e, _PAGE_PRESENT); + put_shadow_ref(entry_get_pfn(l2e)); + l2e = entry_empty(); __shadow_set_l2e(entry->v, entry->va, &l2e); if (entry->v == current) diff --git a/xen/arch/x86/shadow32.c b/xen/arch/x86/shadow32.c index 91c0e2dc5c..17f4e17ae9 100644 --- a/xen/arch/x86/shadow32.c +++ b/xen/arch/x86/shadow32.c @@ -2426,7 +2426,8 @@ static int resync_all(struct domain *d, u32 stype) __shadow_get_l2e(entry->v, entry->va, &l2e); if (l2e_get_flags(l2e) & _PAGE_PRESENT) { - l2e_remove_flags(l2e, _PAGE_PRESENT); + put_shadow_ref(l2e_get_pfn(l2e)); + l2e = l2e_empty(); __shadow_set_l2e(entry->v, entry->va, l2e); if (entry->v == current) -- 2.30.2